SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE [dbo].[pje_porAnosDeServicioEnLaProvincia] @idInscripcion as integer,@puntaje as float output ,@resultado as int output  AS
set nocount on --para anular el trafico econ el cliente (no salen los print)


if @resultado = -9  print 'Resultado vale -9'


set dateformat mdy

declare  @idAgente as int,@CargoGenerico as int,@AsignaturaGenerica as int, @idTipoConvocatoria as int ,@fechaLimite as datetime,@nivel_insc as int,@modalidad_insc as int, @ciclo as int

declare @topeServiciosEnLaProvincia as  float
declare @v1i as datetime,@v1f as datetime,@v2i as datetime,@v2f as datetime,@fini as datetime,@ffin as datetime,@fFinProyectada as datetime

declare @ASProvincia as int, @puntajeSProvincia as float
declare @ASotraProvincia as int, @puntajeSotraProvincia as float,@departamento as int
declare @nivel_del_cargo as integer --nivel del cargo en que se inscribió

declare @fechaCierreDeInscripciones as datetime,@fecharef as datetime

declare @Fecha_de_Alta_Servicio as datetime,@Fecha_de_Baja_Servicio as datetime,@Nivel as integer,@Modalidad as integer,@Grupo as integer
declare @FechaInicioVacaciones as datetime, @fechafinVacaciones as datetime
declare @cantdias as float, @calculo as float,@Pini as datetime,@pfin as datetime,@i as integer, @fecha_aux as datetime
declare @CantDiasAcumulados as float
declare @Minimo as datetime,@Maximo as datetime
declare @grupoIncumbencia as integer
declare @suma as integer

DECLARE @Error INT

BEGIN TRANSACTION
             SET @ERROR=0


		SET @Error = @@ERROR 
		IF @Error <> 0 GOTO Salir




select @topeServiciosEnLaProvincia = (select valor1 from tb_parametros where parametro='TopeAñosServiciosProvincia') --id 50  leo el  tope por servicios en la Provincia     ver el codigo 99 



select  @idAgente=i.Agente,@cargoGenerico = i.CargoGenerico,@AsignaturaGenerica=i.AsignaturaGenerica,@idtipoConvocatoria=Conv.TipoConvocatoria,@FechaLimite=Conv.FechaLimite,@FechaInicioVacaciones=FechaInicioVacaciones,@FechaFinVacaciones=FechaFinVacaciones,@fechaCierreDeInscripciones=Conv.fechaCierre,@nivel_insc = i.nivel,@modalidad_insc=i.modalidad,@ciclo=ciclo
	from 
	tb_inscripcionesConvocatorias i 
		join tb_Convocatorias conv on i.Convocatoria=conv.idConvocatoria 
	where i.idInscripcionConvocatoria=@idInscripcion

delete [SageNET].[dbo].[tb_DetallePuntajes] where agente = @idagente and idconcepto=192 and inscripcion=@idinscripcion


 if @nivel_insc = 3 and @ciclo = 2 set  @nivel_insc=4

select @grupoIncumbencia=case
	when @nivel_insc = 2 then 570
	when @nivel_insc = 3 then 570
	when @nivel_insc = 4 then 571
end


/*
   SELECT @suma = SUM (distinct DATEDIFF (dd,sh.FechaAlta,isnull(sh.FechaBaja,@fechaCierreDeInscripciones))) FROM 
				tb_ServiciosHistoricos sh 
				join tb_organizaciones  o on sh.ubicacionoriginal=o.idorganizaciones
				join tb_localidades loc on o.Localidad = loc.IdLocalidad 
				join tb_gruposDeIncumbencias G on G.idGrupoIncumbencia=sh.GrupoIncumbencias
		--		join tb_reluniongsgu R on r.idgrupounion = G.idGrupoIncumbencia
				join tb_incumbencias h on G.idGrupoIncumbencia=h.grupoIncumbencia
			WHERE sh.IdAgente=@idAgente  and (loc.Departamento in (1, case @resultado when -9 then 2 else 1 end))
			and (h.grupoIncumbencia=@grupoIncumbencia or h.grupoIncumbencia=99) and sh.FechaPresentacion <= @FechaLimite

print 'suma'
print @Suma
print @suma*1.33

if isnull(@suma*1.33,0) between 120 and 180  set @puntaje = 0.5 
else begin
*/		       	DECLARE  cc CURSOR FORWARD_ONLY FOR
			SELECT distinct sh.FechaAlta,isnull(sh.FechaBaja,@fechaCierreDeInscripciones),loc.Departamento FROM 
				tb_ServiciosHistoricos sh 
				join tb_organizaciones  o on sh.ubicacionoriginal=o.idorganizaciones
				join tb_localidades loc on o.Localidad = loc.IdLocalidad 
				join tb_gruposDeIncumbencias G on G.idGrupoIncumbencia=sh.GrupoIncumbencias
		--		join tb_reluniongsgu R on r.idgrupounion = G.idGrupoIncumbencia
				join tb_incumbencias h on G.idGrupoIncumbencia=h.grupoIncumbencia
			WHERE sh.IdAgente=@idAgente and (loc.Departamento in (1, case @resultado when -9 then 2 else 1 end))
			and (h.grupoIncumbencia=@grupoIncumbencia or h.grupoIncumbencia=99) and sh.FechaPresentacion <= @FechaLimite
		ORDER BY sh.FechaAlta


		SET @Error = @@ERROR 
		IF @Error <> 0 GOTO Salir


--		        end

	set @puntaje = 0
	set @maximo=cast ('01/01/1900' as datetime) --artificio para que el primer período siempre se sume

	OPEN cc
	FETCH NEXT FROM cc INTO @Fecha_de_Alta_Servicio,@Fecha_de_Baja_Servicio,@Departamento

             set @CantDiasAcumulados = 0 --inicializo en cero la variable que acumulará la cantidad de días de servicios prestados por el agente
	
	WHILE @@fetch_status = 0

	BEGIN
	            set @fini = @Fecha_de_Alta_Servicio
    
		    -- Fijo las Fechas de Baja abiertas     

		set @ffin = isNull(@Fecha_de_Baja_Servicio,@FechaCierreDeInscripciones)  --si la fecha de baja es null le asigno la fecha de cierre de inscripciones
		if @Fecha_de_Baja_Servicio < @Fecha_de_Alta_Servicio or @Fecha_de_Baja_Servicio>@FechaCierreDeInscripciones or @Fecha_de_Baja_Servicio = cast('01/01/2000' as datetime) or @Fecha_de_Baja_Servicio = cast('01/01/1900' as datetime)
			set @ffin= @FechaCierreDeInscripciones
		else 
			set @ffin= @Fecha_de_Baja_Servicio
		--Calculo los períodos vacacionales mas proximos
		set @v1i=@FechaInicioVacaciones
		while @v1i > @fini
		begin
			
		 set @v1i =dateadd(year,-1,@v1i) --Cast(str(datepart(mm,@FechaInicioVacaciones)) + '/'+str(datepart(dd,@FechaInicioVacaciones))+'/'+str(datepart(yyyy,@v1i)-1) as datetime)
		end
		set @v1f = @v1i + (@FechaFinVacaciones - @FechaInicioVacaciones)
		set @v2f = @v1f
		while @v2f<@ffin or @v2f=@v1f 
		begin
			/*
			If datepart (dd,@v1f) = 29 AND datepart (mm,@v1f) = 2 AND (datepart (yyyy,@V1f) % 4 = 0)  --es decir 29/02 de un año bisiesto
				set @v2f =cast(str(datepart(mm,@v2f)) + '/'+str(datepart(dd,@v2f)-1)+'/'+str(datepart(yyyy,@v2f)+1) as datetime)
			else
				set @v2f =cast(str(datepart(mm,@v2f)) + '/'+str(datepart(dd,@v2f))+'/'+str(datepart(yyyy,@v2f)+1) as datetime) */
			set @v2f =dateadd(year,1,@v2f)
		end
		
		set @v2i = @v2f - (@FechaFinVacaciones - @FechaInicioVacaciones)

		-- Calculo la proyeccion del servicio

		--Empieza y Termina en las mismas Vacaciones

		if (@fini < @v1f  AND @ffin < @v1f)  set @cantdias= datediff(dd,@fini,@ffin)

		--   Empieza en unas vacaciones y termina en otras
		if @fini < @v1f AND @ffin >= @v2i  and @ffin < @v2f
		begin          --atencion, si fini y ffin tienen el mismo año, topear con 365
		print 'Empieza en unas vacaciones y termina en otras ' 	
            		         If datepart (yyyy,@fini) = datepart(yyyy,@ffin) 
             	             		    set @cantdias = 365
                   	    	Else
              	          		set @cantdias = datediff(dd,@fini,@v2f)   --datediff(xx,comienzo,fin) = fin - comienzo
		end

		-- Empieza en Vacaciones y finaliza en periodo lectivo del mismo año
		
		if @fini < @v1f AND @ffin >= @v1f AND @ffin <= dateadd(year,1,@v1f)--cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime)--(@v1i + 365) 
			begin
				print 'Empieza en Vacaciones y finaliza en periodo lectivo del mismo año '
				set @calculo=round(datediff(dd,@v1f,@ffin) * 1.33,0)
				exec @cantdias = sp_minimo 365, @calculo
				set @cantdias=@cantdias+ datediff(dd,@fini,@v1f)
				--set  @cantdias = (@v1f - @fini) +  min( 365, (@ffin - @v1f) * 1.33)
			end

		--Empieza en Vacaciones y finaliza en periodo lectivo de otro año
		
		if @fini < @v1f AND  @ffin >= dateadd(year,1,@v1f)--cast(str(datepart(mm,@v1f)) + '/'+str(datepart(dd,@v1f))+'/'+str(datepart(yyyy,@v1f)+1) as datetime)  --and @ffin >= @v2i -- ojoooooooooo    and @ffin < @v2i  este último and se lo cambié    el 08/04/2005 (estaba mal)
		begin
			print 'Empieza en Vacaciones y finaliza en periodo lectivo de otro año '
			set @fecha_aux=@v2f
			set @fecha_aux=dateadd(dd,-365,@fecha_aux) -- ojo le resto 365 dias
			set @calculo=round (datediff(dd,@fecha_aux,@ffin)* 1.33,0)
			exec @cantdias = sp_minimo 365,  @calculo
			set @cantdias=@cantdias+datediff(dd,@fini,@fecha_aux)
			--set  @cantdias = min(365, (@ffin - (@v2f - 365)) * 1.33) + ((@v2f - 365) - @fini)
		end

		--Empieza en período Lectivo y finaliza en vacaciones del mismo año

		if @fini >= @v1f AND  @ffin >= (@v1i + 365)  AND @ffin <= dateadd(year,1,@v1f)--cast(str(datepart(mm,@v1f)) + '/'+str(datepart(dd,@v1f))+'/'+str(datepart(yyyy,@v1f)+1) as datetime)--@ffin <= (@v1f + 365) 
		begin
			print 'Empieza en período Lectivo y finaliza en vacaciones del mismo año'
			set @fecha_aux=@v1i
			set @fecha_aux=dateadd(dd,365,@fecha_aux) -- ojo le sumo 365 dias
--			set @calculo = round(datediff(dd,@fini,dateadd(dd,365,@fecha_aux)) * 1.33,0)
			set @calculo = round(datediff(dd,@fini,@fecha_aux) * 1.33,0)
			exec @cantdias = sp_minimo 365,@calculo
			set @calculo=datediff(dd,@fini,@ffin)
			exec @cantdias= sp_maximo @cantdias,@calculo
  		  	--set @cantdias = max(min(365, ((@v1i + 365) - @fini) * 1.33), (@ffin - @fini))
		end


		--Empieza en periodo lectivo y termina en otras vacaciones

		if @fini >= @v1f and @ffin >= @v2i and datediff(yy,@v1i,@v2i) >1--@ffin >= cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime) -- @ffin >= dateadd(dd,365,@v1i ) 
		begin
			print 'Empieza en periodo lectivo y termina en otras vacaciones '
			set   @cantdias = datediff(dd,@fini,@v2f)
		end
		--    Empieza y termina en el mismo periodo lectivo
		if @fini >= @v1f and @ffin < dateadd(year,1,@v1i)--cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime) --(@v1i + 365)  
		begin
			print 'Empieza y termina en el mismo periodo lectivo '
			--print @fini
			--print @ffin
			--print datediff(dd,@fini,@ffin) 
			set @calculo=round(datediff(dd,@fini,@ffin) * 1.33,0)
			--print 'Calculo.......................................'
			--print @calculo
			exec @cantdias =  sp_minimo 365, @calculo
			print @cantdias
		end	

		 --Empieza en periodo lectivo y termina en otro
		if   @fini >= @v1f and @ffin < @v2i and datediff(yy,@v1i,@v2i) >1 --@ffin >= cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime)--@ffin >= dateadd(dd,365,@v1i) 
		begin
			print 'Empieza en periodo lectivo y termina en otro '
			set @fecha_aux=@v2f
			set @fecha_aux=dateadd(dd,-365,@fecha_aux) -- ojo le resto 365 dias
			set @calculo=round(datediff( dd,@fecha_aux,@ffin ) * 1.33,0)
			exec @cantdias=  sp_minimo 365,@calculo
			set @cantdias=@cantdias+datediff(dd,@fini,@fecha_aux)
		--		set @cantdias = ((@v2f - 365) - @fini) + min(365, (@ffin - (@v2f - 365)) * 1.33)
		end
		
		-- corro la fecha de baja hasta la de baja del servicio más los días que le corresponde por el proporcional de vacaciones
		-- recordar que cantdias tiene los días de servicio más el proporcional
		
		print 'fecha de alta: '+ cast(@Fecha_de_Alta_Servicio as varchar) + '   fecha de baja: '+ cast(@Fecha_de_baja_Servicio as varchar)
		print 'parámetros de periodos vacacionales'
		print @v1i
		print @v1f
		print @v2i
		print @v2f
		
		
		set @Fecha_de_Baja_Servicio = dateadd(dd,@cantdias,@Fecha_de_Alta_Servicio)
		
		print ' cant.Dias con el proporcional incluido:  ' + cast( @cantDias as varchar)
	
	
		if @Fecha_de_Alta_Servicio >= @maximo 	---------------==================================================================
		   begin
--++			set @CantDiasAcumulados=@CantDiasAcumulados + datediff(dd,@Fecha_de_Alta_Servicio,@Fecha_de_Baja_Servicio)
			set @CantDiasAcumulados=@CantDiasAcumulados + @cantDias
			--print @CantDiasAcumulados			print ' cant.Dias acumulados primera vez:  ' + cast( @CantDiasAcumulados as varchar)
			set @minimo=@Fecha_de_Alta_Servicio			set @maximo=@Fecha_de_Baja_Servicio
		   end
		else 
		begin
			-- si estoy aca quiere decir que la fecha de designacion es mayor 			-- que el minimo y menor que el maximo			-- me fijo que pasa con la de baja			-- si es mayor al maximo tengo que acumular la diferencia entre 			-- maximo y baja y cambiar el maximo			-- si es menor o igual al maximo no tengo que hacer nada
		 	set @calculo=1
			if @Fecha_de_Baja_Servicio >= @maximo
				begin
					-- acumulo la diferencia y actualizo el maximo
					set @CantDiasAcumulados = @CantDiasAcumulados + datediff(dd,@maximo,@Fecha_de_Baja_Servicio)
					set @maximo=@Fecha_de_Baja_Servicio
				end
		end

--		set @Fecha_de_Baja_Servicio = dateadd(dd,@cantdias,@Fecha_de_Alta_Servicio)
print 'fecha de alta: '+ cast(@Fecha_de_Alta_Servicio as varchar) + '   fecha de baja: '+ cast(@Fecha_de_baja_Servicio as varchar)

	INSERT INTO [SageNET].[dbo].[tb_DetallePuntajes](inscripcion,[Agente], [idConcepto], [detalle1], [detalle2], [detalle3], [detalle4], [detalle5], [detalle6], [detalle7], [detalle8])
	VALUES(@idinscripcion,@idagente,192,cast(@Fecha_de_Alta_Servicio as varchar),cast(@Fecha_de_baja_Servicio as varchar),cast( @cantDias as varchar),cast(@CantDiasAcumulados as varchar),cast(@departamento as varchar),null,null,null)


		SET @Error = @@ERROR 
		IF @Error <> 0 GOTO Salir



		FETCH NEXT FROM cc INTO @Fecha_de_Alta_Servicio,@Fecha_de_Baja_Servicio,@Departamento

	print 'cantDias acumulados' + cast(@CantDiasAcumulados as varchar)
	print' '
	print'--  fin     -----------------'
	END --del while del cursor WHILE @@fetch_status = 0

	CLOSE cc
	DEALLOCATE cc 
--	if @departamento=1
--	begin
		set @ASProvincia = @CantDiasAcumulados

if isnull(@ASProvincia,0) between 120 and 180 set @puntaje=0.5
else begin

		If @ASProvincia % 365 >= 183
		        set @ASProvincia =  floor(@ASProvincia / 365) + 1
		        Else
		        set @ASProvincia = floor (@ASProvincia / 365)

		SET @Calculo = @ASProvincia * 2
		--	EXEC @PuntajeSProvincia = sp_minimo @topeServiciosEnLaPRovincia, @Calculo
		--cuando resultado vale -9 significa que  estoy calculando servicios generales que no lleva tope
	--print 'calculo'
		--print @calculo
		--print @resultado
		if @Calculo > (@topeServiciosEnLaPRovincia*2)  and @resultado<>-9  set @PuntajeSProvincia= @topeServiciosEnLaPRovincia*2 else set @PuntajeSProvincia= @Calculo
		--set @PuntajeSProvincia= @Calculo
		set @puntaje=@PuntajeSProvincia

end --isnull(@suma*1.33,0) between 120 and 180
--END -- del IF SUM(DATEDIF.......

print 'Años de servicio en la Provincia: ' + cast(@ASProvincia as varchar)
print 'Puntaje por servicios en la Provincia: ' + cast(@Puntaje as varchar)
Salir:
IF @Error <> 0 
	ROLLBACK TRANSACTION
ELSE 
	COMMIT TRANSACTION
GO
GRANT EXECUTE ON  [dbo].[pje_porAnosDeServicioEnLaProvincia] TO [Juntas]
GO
